package top.ltc_cn.springboot_tools.tools.passwordUtils;

import io.micrometer.common.util.StringUtils;

import java.security.SecureRandom;
import java.util.Base64;

public class SaltUtils {

    // 组合符号(需确保不会在盐值中出现)
    private static final String SALT_DELIMITER = ":=:";

    /**
     * 组合两个盐值
     * @param serverSalt 服务端盐
     * @param clientSalt 客户端盐
     * @return 组合后的字符串
     */
    public static String combineSalts(String serverSalt, String clientSalt) {
        if (StringUtils.isEmpty(serverSalt) || StringUtils.isEmpty(clientSalt)) {
            throw new IllegalArgumentException("盐值不能为空");
        }
        if (serverSalt.contains(SALT_DELIMITER) || clientSalt.contains(SALT_DELIMITER)) {
            throw new IllegalArgumentException("盐值包含非法分隔符");
        }
        return serverSalt + SALT_DELIMITER + clientSalt;
    }

    /**
     * 从组合盐值中分离服务端盐
     * @param combinedSalt 组合后的盐值
     * @return 服务端盐
     */
    public static String extractServerSalt(String combinedSalt) {
        validateCombinedSalt(combinedSalt);
        return combinedSalt.split(SALT_DELIMITER)[0];
    }

    /**
     * 从组合盐值中分离客户端盐
     * @param combinedSalt 组合后的盐值
     * @return 客户端盐
     */
    public static String extractClientSalt(String combinedSalt) {
        validateCombinedSalt(combinedSalt);
        return combinedSalt.split(SALT_DELIMITER)[1];
    }

    /**
     * 验证组合盐值的有效性
     * @param combinedSalt 组合后的盐值
     */
    private static void validateCombinedSalt(String combinedSalt) {
        if (StringUtils.isEmpty(combinedSalt)) {
            throw new IllegalArgumentException("组合盐值不能为空");
        }
        String[] parts = combinedSalt.split(SALT_DELIMITER);
        if (parts.length != 2) {
            throw new IllegalArgumentException("无效的组合盐值格式");
        }
    }

    /**
     * 生成安全的随机盐值 (默认长度为16字节)
     * @return Base64编码的盐值
     */
    public static String generateSalt() {
        return generateSalt(16);
    }

    /**
     * 生成安全的随机盐值
     * @param byteLength 字节长度
     * @return Base64编码的盐值
     */
    public static String generateSalt(int byteLength) {
        SecureRandom random = new SecureRandom();
        byte[] salt = new byte[byteLength];
        random.nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }
}
